﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using gudusoft.gsqlparser;
using System.Data;
using SQLVis.Generador;
using SQLVis.Entidades;

namespace generador
{
    class Program
    {
        //SELECT, UPDATE, DELETE, INSERT

        static void Main(string[] args)
        {
            DataSetNorthwind ds = new DataSetNorthwind();

            //crea el archivo en la carpeta de la solucion
            System.IO.StreamWriter file = 
                new System.IO.StreamWriter("../../../logslowquerysgenerado.log");

            EscribirHeader(file);
            //new System.IO.StreamWriter("c:\\logslowquerysgenerado.log");

            //IMPORTANTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //COMO NO ME CONECTO A NINGUNA BD LO QUE HAGO ES CHAMUYAR LA CANTIDAD DE REGISTROS QUE TIENE CADA TABLA
            //Y LO GUARDO EN ESTE DICCIONARIO 
            Dictionary<string, int> diccionario_Tabla_Cantidad_de_Registros= ConstruirDiccionarioDeTablaCantidadDeRegistros(ds);

            InfoDeLaQuery info1 = new InfoDeLaQuery();
            //TUpdateSqlStatement statement2 = new TUpdateSqlStatement(TDbVendor.DbVMssql);
            //TDeleteSqlStatement statement3 = new TDeleteSqlStatement(TDbVendor.DbVMssql);
            //TInsertSqlStatement statement4 = new TInsertSqlStatement(TDbVendor.DbVMssql);

            string[] usuarios = { "db[db] @ localhost [127.0.0.1]", 
                                  "wsuser[wsuser] @ localhost.localdomain [127.0.0.1]", 
                                  "gimp[drool] @ algernon.retards.org [10.10.10.7]" };


            Func<DataSetNorthwind, Dictionary<string, int>, InfoDeLaQuery> generar_select =   (x, y )=> GeneradorDeSelect.GenerarSelect(x, y);
            Func<DataSetNorthwind, Dictionary<string, int>, InfoDeLaQuery> generar_update = (x, y) => GeneradorDeUpdate.GenerarUpdate(x, y);
            Func<DataSetNorthwind, Dictionary<string, int>, InfoDeLaQuery> generar_delete = (x, y) => GeneradorDeDelete.GenerarDelete(x, y);
            Func<DataSetNorthwind, Dictionary<string, int>,InfoDeLaQuery> generar_insert =   (x, y )=> GeneradorDeInsert.GenerarInsert(x, y);


            int cantidad_HARCODE = 1000;


            EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            info1, usuarios, cantidad_HARCODE, generar_select);
            EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            info1, usuarios, cantidad_HARCODE, generar_update);
            EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
                                            info1, usuarios, cantidad_HARCODE, generar_delete);


//LOS INSERT ESTAN HECHOS PERO DE A 1 Y ASI NO TIENE SENTIDO QUE UNA QUERY DE INSERTAR 1 SOLO REGISTRO TARDE MUCHO
//RESTA INVESTIGAR NOTACION DE QUERY DE INSERT DE VARIOS REGISTROS, VER COMO GENERARLAS Y PARSEARLAS

//EscribirQueryLogCantidadDeVeces(ds, file, diccionario_Tabla_Cantidad_de_Registros,
//                                info1, usuarios, 10, generar_insert);
            file.Close();

        }

        private static void EscribirHeader(System.IO.StreamWriter file)
        {
            file.WriteLine("Log Autogenerado");
            file.WriteLine("Tesis InfoVis");
            file.WriteLine("Time                 Id Command    Argument");
        }

       
        private static void EscribirQueryLogCantidadDeVeces(DataSetNorthwind ds, System.IO.StreamWriter file, 
                                             Dictionary<string, int> diccionario_Tabla_Cantidad_de_Registros, 
                                             InfoDeLaQuery info1, string[] usuarios, int cantidad,
                                             Func<DataSetNorthwind, Dictionary<string, int>, InfoDeLaQuery> generar_query)
        {
            for (int i = 0; i < cantidad; i++)
            {
                file.WriteLine("");
                info1 = generar_query(ds, diccionario_Tabla_Cantidad_de_Registros);
                info1.UserHost = usuarios[Utiles.random.Next(usuarios.Length - 1)];
                info1.Time = DateTime.Now;

                /////////////////////////////////////////////////////////////////////////////////////////////////
                //importante ver como calcular esto con un aproximado piola
                //esto es importante: lo voy a tener que hacer depender de rowexamineted y tambien de algun campo en 
                //alguna tabla en particular no se como para que el analisis saque alguna conclusion
                /////////////////////////////////////////////////////////////////////////////////////////////////
                info1.QueryTime = Utiles.random.Next(1, 15);
                /////////////////////////////////////////////////////////////////////////////////////////////////

                ImprimirInfoQuery(info1.toStringSeparadoEnLineas(), file);
            }
        }


       

        private static Dictionary<string, int> ConstruirDiccionarioDeTablaCantidadDeRegistros(DataSetNorthwind ds)
        {
            Dictionary<string, int> resultado = new Dictionary<string, int>();

            foreach (DataTable dt in ds.Tables)
            {
                resultado.Add(dt.TableName, Utiles.random.Next(Constantes.CantidadMinimaDeRegistrosEnUnaTabla,
                                                                               Constantes.CantidadMaximaDeRegistrosEnUnaTabla));
            }

            return resultado;
        }

        private static void ImprimirInfoQuery(string[] infoquery, System.IO.StreamWriter file)
        {
            for (int i = 0; i < infoquery.Length; i++)
            {
                file.WriteLine(infoquery[i]);
            }
            
        }

    }
}
